﻿using System;
using System.Text;
using System.Collections.Generic;
using System.ComponentModel;

using Sinacor.Servico.Bovespa.ResumoFinanceiro;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Servico.Bovespa.Comum.ResourceAccess;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Servico.Bovespa.ResumoFinanceiro.BusinessLogic
{
    public class Comitente : BaseBusinessLogic
	{
		#region Constantes de Erros
		private const int ERRO_CODIGOCLIENTENAOINFORMADO = 104000;
		private const int ERRO_DATAMOVIMENTONAOINFORMADA = 104001;
		private const int ERRO_CODIGOBOLSAFATURAMENTONAOINFORMADO = 104002;
		private const int ERRO_TIPONEGOCIONAOINFORMADO = 104003;
        private const int ERRO_NEGOCIO_FILHOTE_SEM_OPERACAO = 1111111; //TODO: Colocar o código correto deste erro
		#endregion

		/// <summary>
		/// Metodo responsavel por realizar a consulta de comitentes de forma sintetica
		/// Data: 04/12/2007
		/// Autor: Diogo Milanez
		/// Obs: criacao do metodo
		/// </summary>
		/// <param name="modulo"></param>
		/// <param name="request"></param>
		/// <returns></returns>
		public List<BusinessEntity.Comitente> ConsultarComitente(BusinessEntity.Enum.ModuloChamador modulo, BusinessEntity.Comitente request)
		{
			DateTime dataSistema; 
			//validar consulta comitente
			ValidarConsultaComitente(request);
			
			ResourceAccess.Comitente comitenteRA;
			List<BusinessEntity.Comitente> response;
			//Instanciar ReourceAccess
			comitenteRA = new ResourceAccess.Comitente();
            Parametros parametros = new Parametros();
            dataSistema = parametros.RecuperarDataSistemaBancoDados(); //DateTime.Now;
			comitenteRA.GerarDadosConsultaComitente(request, dataSistema);

			//Executar ReourceAccess
			response = comitenteRA.Consultar(request, dataSistema, false);

			//Return Response
			return response;
		}

		/// <summary>
		/// Metodo responsavel por realizar a consulta de comitentes de forma analitica
		/// Data: 04/12/2007
		/// Autor: Diogo Milanez
		/// Obs: criacao do metodo
		/// </summary>
		/// <param name="modulo"></param>
		/// <param name="request"></param>
		/// <returns></returns>
		public List<BusinessEntity.Comitente> ConsultarComitenteAnalitico(BusinessEntity.Enum.ModuloChamador modulo, BusinessEntity.Comitente request)
		{
			DateTime dataSistema;
			//validar consulta comitente
			ValidarConsultaComitente(request);
			
			////Declare
			ResourceAccess.Comitente comitenteRA;
			List<BusinessEntity.Comitente> response;

			////Instanciar ReourceAccess
			comitenteRA = new ResourceAccess.Comitente();

            Parametros parametros = new Parametros();

            dataSistema = parametros.RecuperarDataSistemaBancoDados(); //DateTime.Now;
			comitenteRA.GerarDadosConsultaComitente(request, dataSistema);

			////Executar ReourceAccess
			response = comitenteRA.Consultar(request, dataSistema, true);

			////Return Response
			return response;
		}

		private void ValidarConsultaComitente(BusinessEntity.Comitente request)
		{
			ValidationException ex = new ValidationException();

			if (request.CodigoCliente == 0)
				ex.AddError(ERRO_CODIGOCLIENTENAOINFORMADO);

			if (request.DataMovimento == DateTime.MinValue)
				ex.AddError(ERRO_DATAMOVIMENTONAOINFORMADA);

			if (String.IsNullOrEmpty(request.CodigoBolsaFaturamento))
				ex.AddError(ERRO_CODIGOBOLSAFATURAMENTONAOINFORMADO);

			if (String.IsNullOrEmpty(request.TipoNegocio))
				ex.AddError(ERRO_TIPONEGOCIONAOINFORMADO);

			if (ex.ValidationErrors != null && ex.ValidationErrors.Count > 0)
				throw ex;
		}

        /// <summary>
        /// Método ValidarOperacaoFilhote.
        /// Data: 25/08/2008
        /// Autor: Valdenir Vanalli Filho (vvanalli.7comm)
        /// Obs: Criação do método
        /// </summary>
        public bool ValidarOperacaoFilhote(Sinacor.Servico.Bovespa.ResumoFinanceiro.BusinessEntity.Parameter.ValidarOperacaoFilhote request)
        {
            //Instancio o objeto de ResourceAccess correspondente.
            Sinacor.Servico.Bovespa.ResumoFinanceiro.ResourceAccess.Comitente resourceAccess = new Sinacor.Servico.Bovespa.ResumoFinanceiro.ResourceAccess.Comitente();
            //Executo o método correspondente, armazenando o resultado e uma variável booleana.
            bool retVal = resourceAccess.ValidarOperacaoFilhote(request);

            //Se o retorno for falso, lanço uma exceção
            if (!retVal)
            {
                ValidationException ex = new ValidationException();
                ex.AddError(ERRO_NEGOCIO_FILHOTE_SEM_OPERACAO);
                throw ex;
            }

            //Se o código atingiu este ponto, a consulta retornou valor
            //e  portanto a operação é válida, retorno true.
            return true;
        }
	}
}
